package com.ac.utils;

import org.apache.commons.lang3.RandomStringUtils;

import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {


    /**
     * 生成指定长度字符串a-z，A-Z,1-9
     * @param length
     * @return
     */
    public static String getRandomString(int length){
        String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random=new Random();
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<length;i++){
            int number=random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    /**
     * 判断字符是否空白
     *
     * @param str
     *            字符串
     * @return true:如果字符串为NUll或者等于"";false:其他情况;
     *
     */
    public static boolean isBlank(String str) {
        if (null == str)
            return true;
        return "".equals(str);
    }

    /**
     * 判断字符是否非空白
     *
     * @param str
     *            字符串
     * @return false:如果字符串为NUll或者等于"";true:其他情况;
     *
     */
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    public static String getString(Object str) {
        if (null == str)
            return "";
        return str.toString();
    }

    /**
     * 手机号码格式校验
     *
     * @param str
     *            手机字符串
     * @return 以1开头11位数字组成，返回true，其他情况返回false。
     */
    public static boolean isMobile(String str) {
        String regex = "^1[0-9]{10}$";
        return str.matches(regex);
    }

    /**
     * 邮箱格式校验
     *
     * @param str
     *            邮箱字符串
     * @return 是邮箱格式返回true，否则返回false。
     */
    public static boolean isEmail(String str) {
        String regex = "^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$";
        return str.matches(regex);
    }

    /**
     * 身份证格式校验
     *
     * @param str
     *            身份证格式字符串
     * @return 如果是身份证格式返回true，否则返回false。
     */
    public static boolean isIdCard(String str) {
        String regex = "(^\\d{15}$)|(^\\d{17}([0-9]|X|x)$)";
        return str.matches(regex);
    }

    /**
     * 中文校验
     *
     * @param str
     * @return
     */
    public static boolean isChinese(String str) {
        String regex = "[\u4e00-\u9fa5]*";
        return str.matches(regex);
    }

    /**
     * 获取uuid(已去掉横杠-)
     *
     * @return 返回uuid字符串
     */
    public static String uuid() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    /**
     * 为数字补零
     *
     * @param num
     *            数字
     * @param len
     *            位数
     * @return 返回前位补0字符串
     */
    public static String addZeros(int num, int len) {
        String str = num + "";
        while (str.length() < len) {
            str = "0" + str;
        }
        return str;
    }

    /**
     * 生成随机字符（包括数字和字母）
     *
     * @param count
     * @return
     */
    public static String randomString(int count) {
        return RandomStringUtils.randomAlphanumeric(count);
    }

    /**
     * 生成随机字母
     *
     * @param count
     * @return
     */
    public static String randomLetters(int count) {
        return RandomStringUtils.randomAlphabetic(count);
    }

    /**
     * 生成随机数字
     *
     * @param count
     * @return
     */
    public static String randomNumber(int count) {
        return RandomStringUtils.randomNumeric(count);
    }


    /**
     * 是否包含
     * @param str1
     * @param str2
     * @return	参数二在参数一中有,则返回真,否则返回假
     */
    public static boolean contains(String str1,String str2){
        if (str1 == null || str2 == null){
            return true;
        }
        if (str1.indexOf(str2) == -1){
            return false;
        }
        else{
            return true;
        }
    }

    /**
     * 数字格式化
     * @param obj
     * @return
     */
    public static String decimalFormat(Object obj){
        if("".equals(trimString(obj)))
            obj = new Double("0");
        return (new DecimalFormat("#,##0.00")).format(obj);
    }
    public static String trimString(Object obj)
    {
        if(obj == null)
            obj = "";
        else
            obj = obj.toString().trim();
        return obj.toString();
    }

    /**
     * 检查字符串的长度是否超长
     * @param str			字符串
     * @param maxLength		最大长度
     * @return				字符串的长度超过最大长度,则返回值,否则返回假
     */
    public static boolean checkLength(String str,int maxLength)
    {
        if (str == null)
        {
            return false;
        }

        return (str.getBytes().length > maxLength) ? true : false;
    }

    /**
     * 得到唯一性序列
     * @return
     */
    public static synchronized String getSequenceString(){
        StringBuilder out = new StringBuilder();
        Calendar cal = Calendar.getInstance();
        out.append(cal.get(Calendar.YEAR));
        int month = cal.get(Calendar.MONTH) + 1;
        if (month < 10){
            out.append("0");
        }
        out.append(month);
        int day = cal.get(Calendar.DATE);
        if (day < 10){
            out.append("0");
        }
        out.append(day);
        int tmp = cal.get(Calendar.HOUR_OF_DAY);
        if (tmp < 10){
            out.append("0");
        }
        out.append(tmp);
        tmp = cal.get(Calendar.MINUTE);
        if (tmp < 10){
            out.append("0");
        }
        tmp = cal.get(Calendar.SECOND);
        if (tmp < 10){
            out.append("0");
        }
        out.append(tmp);
        //加6位序列
        String seq = String.valueOf(10000 + seqNo++);
        out.append(seq.substring(1));
        if (seqNo > 10000){
            seqNo = 1;
        }
        return out.toString();
    }

    /**
     * 判断字符串是否含有中文，含有中文返回真，否则返回假
     * @param str
     * @return
     */
    public static boolean hasChineseChart(String str)
    {
        boolean btn = false;

        if (str != null && str.trim().length() > 0)
        {
            str = str.trim();
            int len = str.length();
            for (int i = 0 ; i < len ; i++)
            {
                char c = str.charAt(i);

                if (c > 128)
                {
                    btn = true;
                    break;
                }
            }
        }


        return btn;
    }

    private static int seqNo = 1;
    /**
     * 首字母大写
     * @param propertyName
     * @return
     */
    public static String capitalize(String propertyName) {
        return propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
    }


    public static String filterEmoji(String source) {
        if(source != null) {
            Pattern emoji = Pattern.compile ("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",
                    Pattern.UNICODE_CASE | Pattern . CASE_INSENSITIVE ) ;
            Matcher emojiMatcher = emoji.matcher(source);
            if ( emojiMatcher.find()){
                source = emojiMatcher.replaceAll("*");
                return source ;
            }
            return source;
        }
        return source;
    }


}
